home *** CD-ROM | disk | FTP | other *** search
/ Aminet 34 / Aminet 34 (2000)(Schatztruhe)[!][Dec 1999].iso / Aminet / disk / optim / PFSDefragTry.lha / PFSDefragTry.e next >
Encoding:
Text File  |  1999-10-08  |  6.4 KB  |  237 lines

  1. /*
  2.     PFSDefragTry
  3.     $Id: PFSDefragTry.e 1.5 1999/10/08 18:15:35 helios Exp $
  4. */
  5.  
  6. OPT OSVERSION=37
  7. OPT REG=5
  8.  
  9. MODULE 'dos/dos'
  10. MODULE 'exec/memory'
  11.  
  12. CONST MAXLINELEN=1000, BUFLEN=65536
  13. CONST TEMPFILELEN=100
  14.  
  15. ENUM OK,ER_BADARGS,ER_DISKVALID,ER_DELETE,ER_COPYING,ER_EXAMINE,ER_PROT,ER_DATE,ER_COMMENT,ER_NOLOCK,BREAK
  16. ENUM ARG_DEVICE,ARG_TEMPDIR,ARG_BUFLEN,NUMARGS
  17.  
  18. PROC delfile(file)
  19.   DEF i
  20.  
  21.   i := DeleteFile(file)
  22.   IF i = FALSE
  23.     i := SetProtection(file, 0)
  24.     IF i= TRUE
  25.       i := DeleteFile(file)
  26.       IF i = FALSE THEN PrintF('Deleting file "\s" failed!', file)
  27.     ELSE
  28.       PrintF('Removing delete protection from file "\s" failed!\n', file)
  29.     ENDIF
  30.   ENDIF
  31. ENDPROC i
  32.  
  33. PROC copyfile(from=NIL,to=NIL,buffer=NIL,buflen=0)
  34.   DEF ok=FALSE, ready=FALSE, readlen, writelen, fh_from=NIL, fh_to=NIL
  35.  
  36.   IF fh_from:=Open(from,MODE_OLDFILE)
  37.     IF fh_to:=Open(to,MODE_NEWFILE)
  38.       IF buffer
  39.         IF buflen
  40.           REPEAT
  41.             readlen:=Read(fh_from, buffer, buflen)
  42.             IF readlen<buflen THEN ready:=TRUE
  43.             IF readlen<>TRUE
  44.               IF readlen>0
  45.                 writelen:=Write(fh_to, buffer, readlen)
  46.               ELSE
  47.                 writelen:=0
  48.               ENDIF
  49.               IF writelen<>readlen
  50.                 ready:=TRUE
  51.               ELSE
  52.                 IF ready THEN ok:=TRUE
  53.               ENDIF
  54.             ENDIF
  55.           UNTIL ready=TRUE
  56.         ENDIF
  57.       ENDIF
  58.       Close(fh_to)
  59.     ENDIF
  60.     Close(fh_from)
  61.   ENDIF
  62. ENDPROC ok
  63.  
  64. PROC main() HANDLE
  65.   DEF fh_fragfiles=NIL,i,s[MAXLINELEN]:STRING,file[MAXLINELEN]:STRING
  66.   DEF rdargs=NIL, templ, args[NUMARGS]:LIST, buffer=NIL, buflen=BUFLEN
  67.   DEF tempfile[TEMPFILELEN]:STRING
  68.   DEF lock=NIL:LONG
  69.   DEF fib=NIL:PTR TO fileinfoblock
  70.   DEF examineok:LONG
  71.  
  72.   args:=[NIL,NIL,NIL]
  73.  
  74.   templ:='DEVICE/A,TEMPDIR,BUFLEN/N'; rdargs:=ReadArgs(templ,args,NIL)
  75.   IF rdargs=NIL THEN Raise(ER_BADARGS)
  76.  
  77.   IF args[ARG_BUFLEN]
  78.     buflen:=Long(args[ARG_BUFLEN])
  79.     IF buflen<4096 THEN buflen:=4096
  80.   ENDIF
  81.  
  82.   PrintF('Examing \s with DiskValid... ',args[ARG_DEVICE])
  83.   Flush(stdout)
  84.  
  85.   StringF(s,'diskvalid \s analyse >RAM:fragfiles',args[ARG_DEVICE])
  86.   i:=SystemTagList(s, NIL)
  87.   IF i<>0
  88.     PrintF('failed!\n')
  89.     Raise(ER_DISKVALID)
  90.   ENDIF
  91.   PrintF('ok.\n')
  92.  
  93.   IF fh_fragfiles:=Open('RAM:fragfiles',MODE_OLDFILE)
  94.  
  95.     PrintF('Allocating io buffer... ')
  96.     Flush(stdout)
  97.     buffer:=AllocVec(buflen,MEMF_PUBLIC)
  98.     IF buffer=NIL
  99.       PrintF('failed!\n')
  100.       Raise("MEM")
  101.     ENDIF
  102.     PrintF('ok.\n')
  103.  
  104.     IF args[ARG_TEMPDIR]
  105.       tempfile:=args[ARG_TEMPDIR]
  106.     ELSE
  107.       tempfile:=args[ARG_DEVICE]
  108.     ENDIF
  109.  
  110.     AddPart(tempfile,'---PFSDefragTry.tmp---',TEMPFILELEN)
  111.  
  112.     WHILE Fgets(fh_fragfiles,file,MAXLINELEN)
  113.       SetStr(file,StrLen(file))
  114.       IF StrCmp(file,'fragmented file',StrLen('fragmented file'))=TRUE
  115.  
  116.         MidStr(file,file,StrLen('fragmented file '))
  117.         i:=InStr(file,' fragments')
  118.         MidStr(file,file,0,i)
  119.         REPEAT
  120.           MidStr(file,file,0,StrLen(file)-1)
  121.           RightStr(s,file,1)
  122.         UNTIL StrCmp(s,'(')=TRUE
  123.         MidStr(file,file,0,StrLen(file)-1)
  124.         MidStr(file,file,0,StrLen(file)-1)
  125.  
  126.         PrintF('Trying to defragment "\s"... ',file)
  127.         Flush(stdout)
  128.  
  129.         /* check for ctrl */
  130.         IF CtrlC()
  131.           PrintF('\n***Break\n')
  132.           IF fh_fragfiles THEN Close(fh_fragfiles)
  133.           CleanUp(10)
  134.         ENDIF
  135.  
  136.         /* get file information */
  137.         examineok := FALSE
  138.         IF (lock := Lock(file, ACCESS_READ)) > 0
  139.           fib := AllocDosObject(DOS_FIB, NIL)
  140.           IF fib = 0
  141.             Raise('MEM')
  142.           ENDIF
  143.           IF Examine(lock, fib)
  144.             examineok := TRUE
  145.           ELSE
  146.             Raise(ER_EXAMINE)
  147.           ENDIF
  148.           UnLock(lock)
  149.         ELSE
  150.           Raise(ER_NOLOCK)
  151.         ENDIF
  152.  
  153.         /* try to copy file to temporary place */
  154.         i:=copyfile(file,tempfile,buffer,buflen)
  155.         IF i = TRUE
  156.           i:=delfile(file)
  157.           IF i = FALSE
  158.             Raise(ER_DELETE)
  159.           ENDIF
  160.  
  161.           /* copy or rename the file back to original place */
  162.           i:=Rename(tempfile,file)
  163.           IF i=FALSE
  164.             i:=copyfile(tempfile,file,buffer,buflen)
  165.             IF i = TRUE
  166.               delfile(tempfile)
  167.             ELSE
  168.               Raise(ER_COPYING)
  169.             ENDIF
  170.           ENDIF
  171.  
  172.           /* set protection */
  173.           i := SetProtection(file,fib.protection)
  174.           IF i = FALSE
  175.             Raise(ER_PROT)
  176.           ENDIF
  177.  
  178.           /* set file date */
  179.           i := SetFileDate(file,fib.datestamp)
  180.           IF i = FALSE
  181.             Raise(ER_DATE)
  182.           ENDIF
  183.  
  184.           /* set comment */
  185.           i := SetComment(file,fib.comment)
  186.           IF i = FALSE
  187.             Raise(ER_COMMENT)
  188.           ENDIF
  189.           PrintF('ok.\n')
  190.  
  191.           IF fib
  192.             FreeDosObject(DOS_FIB, fib)
  193.             fib := 0
  194.           ENDIF
  195.  
  196.         ELSE
  197.           PrintF('failed!\n')
  198.           delfile(tempfile)
  199.         ENDIF
  200.  
  201.       ENDIF
  202.     ENDWHILE
  203.   ENDIF
  204.   Raise(OK)
  205.  
  206. EXCEPT
  207.   SELECT exception
  208.     CASE ER_BADARGS;        PrintFault(IoErr(), 'PFSDefragTry')
  209.     CASE ER_DISKVALID;      PrintF('DiskValid failed!\n')
  210.                             PrintFault(IoErr(), 'PFSDefragTry')
  211.     CASE ER_DELETE;         PrintF('Could not delete "\s"!\n', file)
  212.                             PrintFault(IoErr(), 'PFSDefragTry')
  213.     CASE ER_COPYING;        PrintF('Could not copy temporary file "\s"!\n', tempfile)
  214.                             PrintFault(IoErr(), 'PFSDefragTry')
  215.     CASE ER_EXAMINE;        PrintF('Could not Examine() "\s"!', file)
  216.                             PrintFault(IoErr(), 'PFSDefragTry')
  217.     CASE ER_PROT;           PrintF('Could not set protection bits for "\s"!', file)
  218.                             PrintFault(IoErr(), 'PFSDefragTry')
  219.     CASE ER_DATE;           PrintF('Could not set file date for "\s"!', file)
  220.                             PrintFault(IoErr(), 'PFSDefragTry')
  221.     CASE ER_COMMENT;        PrintF('Could not set comment for "\s"!', file)
  222.                             PrintFault(IoErr(), 'PFSDefragTry')
  223.     CASE ER_NOLOCK;         PrintF('Could not lock file "\s"!', file)
  224.                             PrintFault(IoErr(), 'PFSDefragTry')
  225.     CASE "MEM";             PrintF('Not enough memory!\n')
  226.     DEFAULT;                PrintFault(exception,'PFSDefragtry')
  227.   ENDSELECT
  228.  
  229.   IF fib THEN FreeDosObject(DOS_FIB, fib)
  230.   IF buffer THEN FreeVec(buffer)
  231.   IF fh_fragfiles THEN Close(fh_fragfiles)
  232.   IF rdargs THEN FreeArgs(rdargs)
  233.  
  234. ENDPROC
  235. CHAR '$VER: PFSDefragTry 1.5 (8.10.1999)',0
  236.  
  237.